 #!/usr/bin/perl -w

 ########################################################
 #	IP Track and DNS Update for load balance WAN Access
 ########################################################
 # Date : 19/10/2010
 # Version : 0.2
 # Author : @TiTom
 # Usage : perl script.pl
 # Needs to be run with root privilege (Net::Ping)

##########################################################################################
use Net::DNS;
use Net::Ping;
use strict;
##########################################################################################

BEGIN {
	# Fork.
	my $pidFile = '/var/run/wanderLCD.pid';
	my $pid = fork;
	if ($pid) # parent: save PID
	{
		open PIDFILE, ">$pidFile" or die "can't open $pidFile: $!\n";
		print PIDFILE $pid;
		close PIDFILE;
		exit 0;
	}
}


##########################################################################################
# Init counter
my $init=0;
# TTL Value for DNS entries
my $ttl=1;
# Creaate ICMP test
my $ping = Net::Ping->new("icmp");
# Hosts definition for RR
my @Hosts=("10.2.0.254","10.3.0.254");
# Domain definition
my $domain="secu.interdata.fr";
# RR Definition
my $rr="www.secu.interdata.fr";
# NS Server definition
my $ns_server="172.16.16.253";

##########################################################################################
# Init script : Delete all A record existing for RR and Add two A records for the name.
my $update = Net::DNS::Update->new($domain);
my $res = Net::DNS::Resolver->new;
$update->push(pre    => yxrrset($rr.' A'));
$update->push(update => rr_del($rr.' A'));
foreach my $host(@Hosts)
{
	$update->push(update => rr_add($rr.' '.$ttl.' A '.$host));
}
$res->nameservers($ns_server);
my $reply = $res->send($update);

$init = 1;
while ($init==1) {	
	
	##########################################################################################
	# Delete all RR for www.secu.interdata.fr
	my $update_del = Net::DNS::Update->new($domain);
	$update_del->push(pre    => yxrrset($rr.' A'));
	$update_del->push(update => rr_del($rr.' A'));
	
	##########################################################################################
	# Check VIP connectivity
	my $update_vip = Net::DNS::Update->new($domain);
	my $res_vip = Net::DNS::Resolver->new;
	foreach my $host (@Hosts)
	{
		if($ping->ping($host,1)) { 
			$update_vip->push(update => rr_add($rr.' '.$ttl.' A '.$host)) 
		}
	}
	
	##########################################################################################
	# Send the update to the zone's primary master.
	# First delete original RR
	my $res_del = Net::DNS::Resolver->new;
	$res_del->nameservers($ns_server);
	my $reply_del = $res->send($update_del);
	# Then Add new entries basd on previous test
	$res_vip->nameservers($ns_server);
	my $reply_vip = $res_vip->send($update_vip);
	
	### Wait before run away.
	sleep($ttl);
}
